% Paquetes generales
\usepackage{ifthen}
\usepackage{amssymb}
\usepackage{multicol}
\usepackage[absolute]{textpos}

%%%%%%%%%%%%%%%%%%%%%%%% TWEAKLIST.STY %%%%%%%%%%%%%%%%%%%%%%%%
%% Esto esta copiado de tweaklist.sty, un paquete que encontr� en la
%% web. Define hooks que se ejecutan cada vez que se invoca
%% determinado environment (itemhook, enumhook y descripthook
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\makeatletter
\def\enumhook{}
% \def\enumhooki{}\def\enumhookii{}\def\enumhookiii{}
% \def\enumhookiv{}\def\itemhook{}\def\itemhooki{}\def\itemhookii{}
% \def\itemhookiii{}\def\itemhookiv{}\def\descripthook{}
\def\enumerate{%
  \ifnum \@enumdepth >\thr@@\@toodeep\else
    \advance\@enumdepth\@ne
    \edef\@enumctr{enum\romannumeral\the\@enumdepth}%
      \expandafter
      \list
        \csname label\@enumctr\endcsname
        {\usecounter\@enumctr\def\makelabel##1{\hss\llap{##1}}%
          \enumhook \csname enumhook\romannumeral\the\@enumdepth\endcsname}%
  \fi}
% \def\itemize{%
%   \ifnum \@itemdepth >\thr@@\@toodeep\else
%     \advance\@itemdepth\@ne
%     \edef\@itemitem{labelitem\romannumeral\the\@itemdepth}%
%     \expandafter
%     \list
%       \csname\@itemitem\endcsname
%       {\def\makelabel##1{\hss\llap{##1}}%
%         \itemhook \csname itemhook\romannumeral\the\@itemdepth\endcsname}%
%   \fi}
% \renewenvironment{description}
%                  {\list{}{\labelwidth\z@ \itemindent-\leftmargin
%                           \let\makelabel\descriptionlabel\descripthook}}
%                  {\endlist}
%%%%%%%%%%%%%%%%%%%%%%%% TWEAKLIST.STY %%%%%%%%%%%%%%%%%%%%%%%%


% En las practicas usamos numeros arabigos para los ejercicios.
% Aca cambiamos los enumerate comunes para que usen letras y numeros
% romanos
\newcommand{\arreglarincisos}{%
  \renewcommand{\theenumi}{\alph{enumi}}
  \renewcommand{\theenumii}{\roman{enumii}}
  \renewcommand{\labelenumi}{\theenumi)}
  \renewcommand{\labelenumii}{\theenumii)}
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% PARCIAL %%%%%%%%%%%%%%%%%%%%%%%%
\let\@xa\expandafter
\newcommand{\tituloparcial}{\centerline{\depto -- \lamateria}
  \centerline{\elnombre -- \lafecha}%
  \setlength{\TPHorizModule}{10mm} % Fija las unidades de textpos
  \setlength{\TPVertModule}{\TPHorizModule} % Fija las unidades de
                                % textpos
  \arreglarincisos
  \newcounter{total}% Este contador va a guardar cuantos incisos hay
                    % en el parcial. Si un ejercicio no tiene incisos,
                    % cuenta como un inciso.
  \newcounter{contgrilla} % Para hacer ciclos
  \newcounter{columnainicial} % Se van a usar para los cline cuando un
  \newcounter{columnafinal}   % ejercicio tenga incisos.
  \newcommand{\primerafila}{}
  \newcommand{\segundafila}{}
  \newcommand{\rayitas}{} % Esto va a guardar los \cline de los
                          % ejercicios con incisos, asi queda mas bonito
  \newcommand{\anchodegrilla}{20} % Es para textpos
  \newcommand{\izquierda}{7} % Estos dos le dicen a textpos donde colocar
  \newcommand{\abajo}{2}     % la grilla
  \newcommand{\anchodecasilla}{0.4cm}
  \setcounter{columnainicial}{1}
  \setcounter{total}{0}
  \newcounter{ejercicio}
  \setcounter{ejercicio}{0}
  \newenvironment{ejercicio}[1]
  {%
    \stepcounter{ejercicio}\textbf{Ejercicio \theejercicio. [##1
      puntos]}% Formato
    \renewcommand\@currentlabel{\theejercicio}% Esto es para las
                                % referencias
    \newcommand{\invariante}[2]{%
      {\normalfont\bfseries\ttfamily invariante}%
      \ ####1\hspace{1em}####2%
    }%
    \renewcommand{\problema}[5][result]{
      \encabezadoDeProblema{####1}{####2}{####3}{####4}\hspace{1em}####5}%
  }% Aca se termina el principio del ejercicio
  {% Ahora viene el final
    % Esto suma la cantidad de incisos o 1 si no hubo ninguno
    \ifthenelse{\equal{\value{enumi}}{0}}
    {\addtocounter{total}{1}}
    {\addtocounter{total}{\value{enumi}}}
    \ifthenelse{\equal{\value{ejercicio}}{1}}{}
    {
      \g@addto@macro\primerafila{&} % Si no estoy en el primer ej.
      \g@addto@macro\segundafila{&}
    }
    \ifthenelse{\equal{\value{enumi}}{0}}
    {% No tiene incisos
      \g@addto@macro\primerafila{\multicolumn{1}{|c|}}
      \bgroup% avoid overwriting somebody else's value of \tmp@a
      \protected@edef\tmp@a{\theejercicio}% expand as far as we can
      \@xa\g@addto@macro\@xa\primerafila\@xa{\tmp@a}%
      \egroup% restore old value of \tmp@a, effect of \g@addto.. is
      
      \stepcounter{columnainicial}
    }
    {% Tiene incisos
      % Primero ponemos el encabezado
      \g@addto@macro\primerafila{\multicolumn}% Ahora el numero de items
      \bgroup% avoid overwriting somebody else's value of \tmp@a
      \protected@edef\tmp@a{\arabic{enumi}}% expand as far as we can
      \@xa\g@addto@macro\@xa\primerafila\@xa{\tmp@a}%
      \egroup% restore old value of \tmp@a, effect of \g@addto.. is
      % global 
      % Ahora el formato
      \g@addto@macro\primerafila{{|c|}}%
      % Ahora el numero de ejercicio
      \bgroup% avoid overwriting somebody else's value of \tmp@a
      \protected@edef\tmp@a{\theejercicio}% expand as far as we can
      \@xa\g@addto@macro\@xa\primerafila\@xa{\tmp@a}%
      \egroup% restore old value of \tmp@a, effect of \g@addto.. is
      % global 
      % Ahora armamos la segunda fila
      \g@addto@macro\segundafila{\multicolumn{1}{|c|}{a}}%
      \setcounter{contgrilla}{1}
      \whiledo{\value{contgrilla}<\value{enumi}}
      {%
        \stepcounter{contgrilla}
        \g@addto@macro\segundafila{&\multicolumn{1}{|c|}}
        \bgroup% avoid overwriting somebody else's value of \tmp@a
        \protected@edef\tmp@a{\alph{contgrilla}}% expand as far as we can
        \@xa\g@addto@macro\@xa\segundafila\@xa{\tmp@a}%
        \egroup% restore old value of \tmp@a, effect of \g@addto.. is
        % global 
      }
      % Ahora armo las rayitas
      \setcounter{columnafinal}{\value{columnainicial}}
      \addtocounter{columnafinal}{-1}
      \addtocounter{columnafinal}{\value{enumi}}
      \bgroup% avoid overwriting somebody else's value of \tmp@a
      \protected@edef\tmp@a{\noexpand\cline{%
          \thecolumnainicial-\thecolumnafinal}}%
      \@xa\g@addto@macro\@xa\rayitas\@xa{\tmp@a}%
      \egroup% restore old value of \tmp@a, effect of \g@addto.. is
      \setcounter{columnainicial}{\value{columnafinal}}
      \stepcounter{columnainicial}
    }
    \setcounter{enumi}{0}%
    \vspace{0.2cm}%
  }%
  \newcommand{\tercerafila}{}
  \newcommand{\armartercerafila}{
    \setcounter{contgrilla}{1}
    \whiledo{\value{contgrilla}<\value{total}}
    {\stepcounter{contgrilla}\g@addto@macro\tercerafila{&}}
  }
  \newcommand{\grilla}{%
    \g@addto@macro\primerafila{&\textbf{TOTAL}}
    \g@addto@macro\segundafila{&}
    \g@addto@macro\tercerafila{&}
    \armartercerafila
    \ifthenelse{\equal{\value{total}}{\value{ejercicio}}}
    {% No hubo incisos
      \begin{textblock}{\anchodegrilla}(\izquierda,\abajo)
        \begin{tabular}{|*{\value{total}}{p{\anchodecasilla}|}c|}
          \hline
          \primerafila\\
          \hline
          \tercerafila\\
          \tercerafila\\
          \hline
        \end{tabular}
      \end{textblock}
    }
    {% Hubo incisos
      \begin{textblock}{\anchodegrilla}(\izquierda,\abajo)
        \begin{tabular}{|*{\value{total}}{p{\anchodecasilla}|}c|}
          \hline
          \primerafila\\
          \rayitas
          \segundafila\\
          \hline
          \tercerafila\\
          \tercerafila\\
          \hline
        \end{tabular}
      \end{textblock}
    }
  }%
  \vspace{0.4cm}
  \textbf{LU:}
  
  \textbf{Apellidos:}
  
  \textbf{Nombres:}
  \vspace{0.5cm}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% PARCIAL %%%%%%%%%%%%%%%%%%%%%%%%

% Esta parte arma cosas que dependen de si estamos usando beamer o no
% tocarEspacios ajusta leftskip y parindent para poder usarlas 
\@ifclassloaded{beamer}{%
  \newcommand{\tocarEspacios}{%
    \addtolength{\leftskip}{4em}%
    \addtolength{\parindent}{-3em}%
  }%
}
{%
  \usepackage[top=1cm,bottom=2cm,left=1cm,right=1cm]{geometry}%
  \usepackage{color}%
  \newcommand{\tocarEspacios}{%
    \addtolength{\leftskip}{2.5em}%
    \addtolength{\parindent}{-3em}%
  }%
}

\@ifundefined{mod}{%
  \newcommand{\mod}{\ \nom{mod}\ }%
}{%
  \renewcommand{\mod}{\ \nom{mod}\ }%
}
% Simbolos varios

% La Z de los numeros enteros
\newcommand{\ent}{\ensuremath{\mathbb{Z}}}
% La R de float
\newcommand{\float}{\ensuremath{\mathbb{R}}}
% El tipo Bool
\newcommand{\bool}{\ensuremath{\mathsf{Bool}}}
\newcommand{\True}{\ensuremath{\mathrm{True}}}
\newcommand{\False}{\ensuremath{\mathrm{False}}}
\newcommand{\Then}{\ensuremath{\rightarrow}}
\newcommand{\Iff}{\ensuremath{\leftrightarrow}}
\newcommand{\implica}{\ensuremath{\longrightarrow}}
\newcommand{\IfThenElse}[3]{\ensuremath{\mathsf{if}\ #1\ \mathsf{then}\ #2\ \mathsf{else}\ #3}}

% Comandos de formato
\newcommand{\nom}[1]{\ensuremath{\mathsf{#1}}}
% Comando para un comentario entre /* */. Font normal
\newcommand{\comentario}[1]{{/*\ #1\ */}}

\newcommand{\ya}{ya especificado en el trabajo anterior}

% Comandos del lenguaje de especificacion
% Selector para sacar elementos de una lista
\newcommand{\selec}{\ensuremath{\leftarrow}}
% La lista vacia
\newcommand{\lv}{[\,]}
% El ++ "bonito"
\newcommand{\masmas}{\ensuremath{++\ }}
\newcommand{\ylogico}{\ensuremath{\ \wedge \ }}
\newcommand{\ologico}{\ensuremath{\ \vee \ }}

% Las barritas
\newcommand{\longitud}[1]{\ensuremath{\left|#1\right|}}
\newcommand{\cons}{\nom{cons}}
\newcommand{\indice}{\nom{indice}}
\newcommand{\conc}{\nom{conc}}
\newcommand{\concat}{\nom{concat}}
\newcommand{\cab}{\nom{cab}}
\newcommand{\cola}{\nom{cola}}
\newcommand{\sub}{\nom{sub}}
\newcommand{\en}{\nom{en}}
\newcommand{\cuenta}[2]{\nom{cuenta}\ensuremath{(#1, #2)}}
\newcommand{\suma}{\nom{suma}}
\newcommand{\twodots}{\nom{..}}
\newcommand{\rango}[2]{[#1\twodots#2]}
\newcommand{\rangoac}[2]{(#1\twodots#2]}
\newcommand{\rangoca}[2]{[#1\twodots#2)}
\newcommand{\rangoaa}[2]{(#1\twodots#2)}


% Listas por comprension. El primer parametro es la expresion y el
% segundo tiene los selectores y las condiciones.
\newcommand{\comp}[2]{[\,#1\,|\,#2\,]}
% Listas por extensi�n
\newcommand{\ext}[1]{[\,#1\,]}

% acum: el primer parametro es la expresion, el segundo la definicion
% de la variable de acumulacion, y el tercero los selectores y condiciones.
\newcommand{\acum}[3]{\mathrm{acum}(#1\; | \; #2, #3)}

\newcommand{\sinonimo}[2]{%
  \noindent%
  {\normalfont\bfseries\ttfamily tipo\ }%
  #1\ =\ #2%
  {\normalfont\bfseries\,;\par}
}

\newcommand{\tupla}[2]{\ensuremath{\langle}#1, #2\ensuremath{\rangle}}

% El primer par�metro es el nombre del tipo
% El segundo par�metro es la lista de elementos
\newcommand{\enumerado}[2]{%
  \noindent%
  {\normalfont\bfseries\ttfamily tipo\ }%
  #1\ =\ #2%
  {\normalfont\bfseries\,;\par}
}

\newcommand{\aux}[4]{%
  {
    \addtolength{\leftskip}{1em}
    \addtolength{\parindent}{-2.5em}
    {\normalfont\bfseries\ttfamily aux\ }%
    {\normalfont\ttfamily #1}%
    \ifthenelse{\equal{#2}{}}{}{\ (#2)}\ : #3\, = \ensuremath{#4}%
    {\normalfont\bfseries\,;\par}
  }
}

\newcommand{\encabezadoDeProblema}[4]{%
  % Ponemos la palabrita problema en tt
%  \noindent%
  {\normalfont\bfseries\ttfamily problema}%
  % Ponemos el nombre del problema
  \ %
  {\normalfont\ttfamily #2}%
  \ 
  % Ponemos los parametros
  (#3)%
  \ifthenelse{\equal{#4}{}}{}{%
  \ =\ %
  % Ponemos el nombre del resultado
  {\normalfont\ttfamily #1}%
  % Por ultimo, va el tipo del resultado
  \ : #4}
}

\newcommand{\encabezadoDeTipo}[2]{%
  % Ponemos la palabrita tipo en tt
  {\normalfont\bfseries\ttfamily tipo}%
  % Ponemos el nombre del tipo
  \ %
  {\normalfont\ttfamily #2}%
  \ifthenelse{\equal{#1}{}}{}{$\langle$#1$\rangle$}
}

\newenvironment{problema}[4][result]{%
  % El parametro 1 (opcional) es el nombre del resultado
  % El parametro 2 es el nombre del problema
  % El parametro 3 son los parametros
  % El parametro 4 es el tipo del resultado
  % Preambulo del ambiente problema
  % Tenemos que definir los comandos requiere, asegura, modifica y aux
  \newcommand{\requiere}[2][]{%
    {\normalfont\bfseries\ttfamily requiere}%
    \ifthenelse{\equal{##1}{}}{}{\ {\normalfont\ttfamily ##1} :}\ %
    \ensuremath{##2}%
    {\normalfont\bfseries\,;\par}%
  }
  \newcommand{\asegura}[2][]{%
    {\normalfont\bfseries\ttfamily asegura}%
    \ifthenelse{\equal{##1}{}}{}{\ {\normalfont\ttfamily ##1} :}\
    \ensuremath{##2}%
    {\normalfont\bfseries\,;\par}%
  }
  \newcommand{\modifica}[1]{%
    {\normalfont\bfseries\ttfamily modifica\ }%
    \ensuremath{##1}%
    {\normalfont\bfseries\,;\par}%
  }
  \renewcommand{\aux}[4]{%
    {\normalfont\bfseries\ttfamily aux\ }%
    {\normalfont\ttfamily ##1}%
    \ifthenelse{\equal{##2}{}}{}{\ (##2)}\ : ##3\, = \ensuremath{##4}%
    {\normalfont\bfseries\,;\par}%
  }
  \newcommand{\res}{#1}
  \vspace{1ex}
  \noindent
  \encabezadoDeProblema{#1}{#2}{#3}{#4}
  % Abrimos la llave
  \{\par%
  \tocarEspacios
}
% Ahora viene el cierre del ambiente problema
{
  % Cerramos la llave
  \noindent\}
  \vspace{1ex}
}

\newenvironment{tipo}[2][]{%
  % Preambulo del ambiente tipo
  % Tenemos que definir los comandos observador (con requiere) y aux
  \newcommand{\observador}[3]{%
    {\normalfont\bfseries\ttfamily observador\ }%
    {\normalfont\ttfamily ##1}%
    \ifthenelse{\equal{##2}{}}{}{\ (##2)}\ : ##3%
    {\normalfont\bfseries\,;\par}%
  }
  \newcommand{\requiere}[2][]{{%
    \addtolength{\leftskip}{3em}%
    \setlength{\parindent}{-2em}%
    {\normalfont\bfseries\ttfamily requiere}%
    \ifthenelse{\equal{##1}{}}{}{\ {\normalfont\ttfamily ##1} :}\ 
    \ensuremath{##2}%
    {\normalfont\bfseries\,;\par}}
  }
  \newcommand{\explicacion}[1][]{{%
    \addtolength{\leftskip}{3em}%
    \setlength{\parindent}{-2em}%
    \par \hspace{2.3em} ##1%
    }
  }
  \newcommand{\invariante}[2][]{%
    {\normalfont\bfseries\ttfamily invariante}%
    \ifthenelse{\equal{##1}{}}{}{\ {\normalfont\ttfamily ##1} :}\ 
    \ensuremath{##2}%
    {\normalfont\bfseries\,;\par}%
  }
  \renewcommand{\aux}[4]{%
    {\normalfont\bfseries\ttfamily aux\ }%
    {\normalfont\ttfamily ##1}%
    \ifthenelse{\equal{##2}{}}{}{\ (##2)}\ : ##3\, = \ensuremath{##4}%
    {\normalfont\bfseries\,;\par}%
  }
  \vspace{1ex}
  \noindent
  \encabezadoDeTipo{#1}{#2}
  % Abrimos la llave
  \{\par%
  \tocarEspacios
}
% Ahora viene el cierre del ambiente tipo
{
  % Cerramos la llave
  \noindent\}
  \vspace{1ex}
}

% Cuestiones de enunciados

% Primero definiciones de cosas al estilo title, author, date
\def\materia#1{\gdef\@materia{#1}}
\def\@materia{No especifi\'o la materia}
\def\lamateria{\@materia}

\def\cuatrimestre#1{\gdef\@cuatrimestre{#1}}
\def\@cuatrimestre{No especifi\'o el cuatrimestre}
\def\elcuatrimestre{\@cuatrimestre}

\def\anio#1{\gdef\@anio{#1}}
\def\@anio{No especifi\'o el anio}
\def\elanio{\@anio}

\def\fecha#1{\gdef\@fecha{#1}}
\def\@fecha{\today}
\def\lafecha{\@fecha}

\def\nombre#1{\gdef\@nombre{#1}}
\def\@nombre{No especific'o el nombre}
\def\elnombre{\@nombre}

\def\practica#1{\gdef\@practica{#1}}
\def\@practica{No especifi\'o el n\'umero de pr\'actica}
\def\lapractica{\@practica}

% Esta macro convierte el numero de cuatrimestre a palabras
\newcommand{\cuatrimestreLindo}{
  \ifthenelse{\equal{\elcuatrimestre}{1}}
  {Primer cuatrimestre}
  {\ifthenelse{\equal{\elcuatrimestre}{2}}
  {Segundo cuatrimestre}
  {Verano}}
}

\newcommand{\depto}{{UBA -- Facultad de Ciencias Exactas y Naturales --
      Departamento de Computaci\'on}}

\newcommand{\titulopractica}{
  \centerline{\depto}
  \vspace{1ex}
  \centerline{{\Large\lamateria}}
  \vspace{0.5ex}
  \centerline{\cuatrimestreLindo de \elanio}
  \vspace{2ex}
  \centerline{{\huge Pr\'actica \lapractica -- \elnombre}}
  \vspace{5ex}
  \arreglarincisos
  \newcounter{ejercicio}
  \newenvironment{ejercicio}{\stepcounter{ejercicio}\textbf{Ejercicio
      \theejercicio}%
    \renewcommand\@currentlabel{\theejercicio}%
  }{\vspace{0.2cm}}
}  

\newcommand{\titulotp}{
  \centerline{\depto}
  \vspace{1ex}
  \centerline{{\Large\lamateria}}
  \vspace{0.5ex}
  \centerline{\cuatrimestreLindo de \elanio}
  \vspace{0.5ex}
  \centerline{\lafecha}
  \vspace{2ex}
  \centerline{{\huge\elnombre}}
  \vspace{5ex}
}

% AMBIENTE CONSIGNAS
% Se usa en el TP para ir agregando las cosas que tienen que resolver
% los alumnos.
% Dentro del ambiente hay que usar \item para cada consigna

\newcounter{consigna}
\setcounter{consigna}{0}

\newenvironment{consignas}{%
  \newcommand{\consigna}{\stepcounter{consigna}\textbf{\theconsigna.}}%
  \newcommand{\ejercicio}[1]{\item ##1 }
  \renewcommand{\problema}[5][result]{\item
    \encabezadoDeProblema{##1}{##2}{##3}{##4}\hspace{1em}##5}%
  \newcommand{\invariante}[2]{\item%
    {\normalfont\bfseries\ttfamily invariante}%
    \ ##1\hspace{1em}##2%
  }
  \renewcommand{\aux}[4]{\item%
    {\normalfont\bfseries\ttfamily aux\ }%
    {\normalfont\ttfamily ##1}%
    \ifthenelse{\equal{##2}{}}{}{\ (##2)}\ : ##3 \hspace{1em}##4%
  }
  % Comienza la lista de consignas
  \begin{list}{\consigna}{%
      \setlength{\itemsep}{0.5em}%
      \setlength{\parsep}{0cm}%
    }
}%
{\end{list}}


% MACROS ESPECIFICAS DE IMPERATIVO

% El primer parametro es el nombre del segundo parametro del ==
% El segundo parametro es el nombre del tipo
\newcommand{\eligualigual}[2]%
{%
\begin{problema}{operator==}{this,#1 : #2}{Bool}
  \asegura{result == (this == #1)}
\end{problema}
}

% Manejo de listas
% LaTeX deja demasiado espacio entre los items para nuestros prop�sitos.
\renewcommand{\enumhook}{\setlength{\itemsep}{-4pt}}

% Esto ajusta el espacio que se deja antes y despu�s de los
% environments multicol
\setlength{\multicolsep}{5pt}

\makeatother
